﻿/*-------------------------
*
*--引用--
*
*/
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

/*-------------------------
*
*--数据结构--
*
*/


enum My
{

	WIDTH = 1200,//地图宽
	HEIGHT = 900,//地图高
	TOGGLEINTERVAL = 15,//黑白切换间隔
	BULLLET_NUM = 4, //玩家子弹数量 
	ENEMY_NUM = 20, //敌人数量
	PlAYER_WIDTH = 16,//玩家图像宽
	PLAYER_HEIGHT = 16,//玩家图像高
	ENEMY_WIDTH = 48,//敌人图像宽
	ENEMY_HEIGHT = 48,//敌人图像高
	SKILL_NUM=3//技能数

};

bool day;//Ture白天false黑夜
int integral;//积分
int start_time;//游戏开始时间
int wear_num;
bool first_use[SKILL_NUM];

COLORREF color1 = WHITE;
COLORREF color2 = BLACK;
COLORREF temp;

//保存地图图片 （如果有的话）
IMAGE map;
//保存玩家图片 player
IMAGE img_player[3];
//保存子弹图片
IMAGE img_bull[3];
//保存敌人图片
IMAGE img_enemy[2][3];



struct Role //角色结构
{
	//坐标为长方形左上角坐标
	int x;//横坐标
	int y;//纵坐标
	bool live;//是否存活
	int width;//实际判定宽
	int height;//实际判定高
	int hp;//生命值
	int status;//角色状态  0跑步1等待2无敌
	int orientation;//玩家朝向0上1下2左3右
	int ACK;//攻击力
	int ACK_R;//攻击半径
	int picture;


}player, bull[BULLLET_NUM], enemy[ENEMY_NUM];


/*-------------------------
*
*--初始化--
*
*/

void loadImg();//加载图片
void gameInit();//游戏初始化
void ememyInit();//敌人初始化
void ememyHP(int i);//指定敌人属性初始化
void playerInit();//玩家初始化
void bullInit();//子弹初始化


/*-------------------------
*
*--绘制画面--
*
*/
void drawMenu(int selectedOption);//绘制主菜单界面函数
void gradientBaw();//黑白渐变函数 Black and white gradient 
void gameDraw();//游戏绘制函数
void introduceTeam();//打印团队介绍
void introduceGameplay();//打印玩法介绍
void showStandings();//*查看积分榜
void showSetting();//显示设置
void showSuspend(int selectedOption);//绘制暂停界面
void showGameover();//绘制游戏结束界面
void showAttributes();//显示玩家部分属性




/*-------------------------
*
*--运行逻辑--
*
*/
void menu();//主菜单函数
void gameRum();//游戏运行函数
void playerMove(int speed);//判断控制玩家操作
void suspend();//暂停控制函数
bool timer(int ms, int id); //定时器
void playerAttack();//玩家攻击Q
void playerFlash();//玩家闪现E
void playerShield();//玩家护盾R
void enemyMove(int speed);//敌人移动
void createBullet();//子弹生成
void BulletMove(int speed);//子弹移动
void createEnemy();//敌人生成
void adjustCoordinates();//坐标修正函数
void playerTakeDamage();//玩家受到攻击
void enemyTakeDamage();//敌人受到攻击
void dayAltionMethod();//昼夜变换函数
bool ifGameover();//判断游戏是否结束




/*----------------------------------------------------------------------------------------------------------
*
*-#-具体代码实现-#-示例仅做参考
*
*/
int main()
{
	menu();
	return 0;
}
/*-------------------------
*
*--初始化--
*
*/
void loadImg()//加载图片
{
	/*加载图片
	* 负责人：
	* 功能：
	* 加载图片
	示例参考：
	loadimage(&bk, "./images/background.jpg");
	*/
	loadimage(&img_player[0], "./images/player.png");
	loadimage(&img_player[1], "./images/player-white.png");
	loadimage(&img_player[2], "./images/player-black.png");
	loadimage(&img_bull[0], "./images/bull.png");
	loadimage(&img_bull[1], "./images/bull-white.png");
	loadimage(&img_bull[2], "./images/bull-black.png");
	loadimage(&img_enemy[0][0], "./images/enemy.png");
	loadimage(&img_enemy[0][1], "./images/enemy-white.png");
	loadimage(&img_enemy[0][2], "./images/enemy-black.png");
	loadimage(&img_enemy[1][0], "./images/peristele.png");
	loadimage(&img_enemy[1][1], "./images/peristele-white.png");
	loadimage(&img_enemy[1][2], "./images/peristele-black.png");
}
void gameInit()//游戏初始化
{
	/*游戏初始化
	* 负责人：封永昌
	* 功能：
	* 初始化全局变量
	调用其他初始化函数
	*/
	day = true;//True白天false黑夜
	integral = 0;//积分
	wear_num=0;
	//start_time;//游戏开始时间

	for (int i = 0; i < SKILL_NUM; i++) {
		first_use[i] = true;
	}
	playerInit();
	ememyInit();
	bullInit();
	loadImg();
}
void ememyInit()//敌人初始化
{
	/*敌人初始化
	* 负责人：              封永昌
	* 功能：
	* 初始化敌人的属性面板
	* 可以调用敌人属性初始化
	* 示例参考：
	* */
	for (int i = 0; i < ENEMY_NUM; i++) {
		ememyHP(i);
		enemy[i].x = rand() % WIDTH;//横坐标
		enemy[i].y = rand() % HEIGHT;//纵坐标
		enemy[i].picture = rand() % 4;
	}
	
}
void ememyHP(int i)//指定敌人属性初始化
{
	/*指定敌人属性初始化
	* 负责人：封永昌
	* 功能：
	* 将指定的敌人初始化
	* （在开局和敌人死亡会调用）
	* 示例参考：
	* enemy[i].hp = 3;
	  enemy[i].width = 104;
	  enemy[i].height = 148;
	 */
	enemy[i].live = false; // 是否存活
	enemy[i].hp = 3;//生命值
	enemy[i].width = 48;//实际判定宽
	enemy[i].height = 48;//实际判定高

	
}
void playerInit()//玩家初始化
{
	/*玩家初始化
	* 负责人：封永昌
	* 功能：
	* 初始化玩家位置以及属性
	* 示例参考：
	* player.x = WIDTH / 2;
	player.y = HEIGHT - 120;
	（坐标可随机）
	 */
	player.x = rand() % WIDTH;//横坐标
	player.y = rand() % HEIGHT;//纵坐标
	
	player.live = true;//是否存活
	player.width = 4;//实际判定宽
	player.height = 4;//实际判定高
	player.hp = 5;//生命值
	player.status = 0;//角色状态
	player.orientation=0;//玩家朝向0上1下2左3右
	player.ACK=1;//攻击力
	
}
void bullInit()//子弹初始化
{
	/*玩家初始化
	* 负责人：封永昌
	* 功能：
	* 初始化子弹位置以及属性
	* 
	*/
	for (int i = 0; i < BULLLET_NUM; i++) {
		bull[i].x = 0;
		bull[i].y = 0;
		bull[i].live = false;
	}
	 
}
// 定义在指定位置中央绘制一个矩形，并在其中央显示指定的文字的函数
void showRectWithText(int x, int y, int width, int height, int size, const char* text)
{

	// 绘制矩形
	setlinecolor(WHITE);
	
	rectangle(x, y, x + width, y + height);

	// 设置文字格式
	settextstyle(size, 0, "楷体");
	// 计算文字宽度和高度
	int textWidth = textwidth(text);
	int textHeight = textheight(text);

	// 计算文字的位置
	int textX = x + (width - textWidth) / 2;
	int textY = y + (height - textHeight) / 2;

	outtextxy(textX, textY, text);
}


/*-------------------------
*
*--绘制画面--
*
*/
void drawMenu(int selectedOption)//绘制主菜单界面函数
{

	/*绘制主菜单界面函数
	* 负责人：衡皓
	* 功能：
	* 绘制主菜单界面
	* 示例参考：
	*  黑白时间
	*
	* 》开始游戏《
	* 游戏设置
	* 玩法结束
	* 关于我们
	* 积分榜
	* 退出游戏
	*
	*/
	
	cleardevice();
	settextstyle(28, 0, _T("宋体"));
	setbkcolor(BLACK);
	FlushBatchDraw();

	settextcolor(RGB(50,50,50));//设置字体颜色-“黑”
	settextstyle(60, 0, "琥珀体");//设置字体格式
	outtextxy(65, 50, "黑");//打印字体-“黑”

	settextcolor(RGB(244,244,244));//设置字体颜色-“白”
	settextstyle(60, 0, "琥珀体");//设置字体格式
	outtextxy(195, 50, "白");//打印字体-“白”

	settextcolor(RGB(89,89,89));//设置字体颜色-“白”
	settextstyle(60, 0, "琥珀体");//设置字体格式
	outtextxy(325, 50, "世");//打印字体-“世”

	settextcolor(RGB(200,200,200));//设置字体颜色-“白”
	settextstyle(60, 0, "琥珀体");//设置字体格式
	outtextxy(455, 50, "界");//打印字体-“界”
	setcolor(selectedOption == 0 ? RGB(77, 77, 77) : WHITE);

	showRectWithText(230, 250, 150, 40, 30, _T("开始游戏"));
	setcolor(selectedOption == 1 ? RGB(77, 77, 77) : WHITE);

	showRectWithText(230, 300, 150, 40, 30, "游戏设置");

	setcolor(selectedOption == 2 ? RGB(77, 77, 77) : WHITE);

	showRectWithText(230, 350, 150, 40, 30, _T("玩法介绍"));
	setcolor(selectedOption == 3 ? RGB(77, 77, 77) : WHITE);
	showRectWithText(230, 400, 150, 40, 30, _T("关于我们"));
	setcolor(selectedOption == 4 ? RGB(77, 77, 77) : WHITE);
	showRectWithText(230, 500, 150, 40, 30, _T("积分榜"));
	setcolor(selectedOption == 5 ? RGB(77, 77, 77) : WHITE);
	showRectWithText(230, 600, 150, 40, 30, _T("退出游戏"));
	setcolor(selectedOption == 6 ? RGB(77, 77, 77) : WHITE);
	

	
}
void gradientBaw()//黑白渐变函数 Black and white gradient 
{
	
	/*黑白渐变函数
	* 负责人：陈天乐
	* 功能：
	* 黑白颜色变化
	* 在昼夜变化是调用
	*/
	
	
		// 渐变时间间隔和渐变步数
	//int interval = 3000;   // 3秒
	int steps = 100;       // 100步
	// 计算当前渐变颜色
	cleardevice();
	if (timer(100, 9)&&wear_num < steps-1) {
		// 绘制渐变背景
		wear_num++;
		

		FlushBatchDraw(); // 刷新渐变效果

		//Sleep(interval / steps);  // 等待一小段时间
	}
	if (wear_num >= steps-1&& timer(30000,1)) {
		temp = color1;
		color1 = color2;
		color2 = temp;
		wear_num = 0;
	}
	
	int red = GetRValue(color1) * (steps - wear_num) / steps + GetRValue(color2) * wear_num / steps;
	int green = GetGValue(color1) * (steps - wear_num) / steps + GetGValue(color2) * wear_num / steps;
	int blue = GetBValue(color1) * (steps - wear_num) / steps + GetBValue(color2) * wear_num / steps;
	COLORREF currentColor = RGB(red, green, blue);
	
	setbkcolor(currentColor);

	// 交换色彩
	
	

	

}
void gameDraw()//游戏绘制函数
{


	/*游戏绘制函数
	* 负责人：
	* 功能：
	* 根据各个参数绘制游戏界面

	}
	*/


	gradientBaw();
	if (day) {
		putimage(player.x, player.y, PlAYER_WIDTH, PLAYER_HEIGHT, &img_player[0], 0, 16, NOTSRCERASE);
		putimage(player.x, player.y, PlAYER_WIDTH, PLAYER_HEIGHT, &img_player[1], 0, 16, SRCINVERT);
	}
	else {
		putimage(player.x, player.y, PlAYER_WIDTH, PLAYER_HEIGHT, &img_player[0], 0, 16, NOTSRCERASE);
		putimage(player.x, player.y, PlAYER_WIDTH, PLAYER_HEIGHT, &img_player[2], 0, 16, SRCINVERT);
	}
	
	//circle(player.x + 8, player.y + 16, R);
	if (day) {
		for (int i = 0; i < BULLLET_NUM; i++) {
			if (bull[i].live) {

				putimage(bull[i].x, bull[i].y, &img_bull[0], NOTSRCERASE);
				putimage(bull[i].x, bull[i].y, &img_bull[1], SRCINVERT);


			}
		}
	}
	else {
		for (int i = 0; i < BULLLET_NUM; i++) {
			if (bull[i].live) {

				putimage(bull[i].x, bull[i].y, &img_bull[0], NOTSRCERASE);
				putimage(bull[i].x, bull[i].y, &img_bull[2], SRCINVERT);


			}
		}
	}
	if (day) {
		//绘制敌人
		for (int i = 0; i < ENEMY_NUM; i++) {
			if (enemy[i].live) {
				putimage(enemy[i].x, enemy[i].y, ENEMY_WIDTH, ENEMY_HEIGHT, &img_enemy[0][0], 0, 0, NOTSRCERASE);
				putimage(enemy[i].x, enemy[i].y, ENEMY_WIDTH, ENEMY_HEIGHT, &img_enemy[0][1], 0, 0, SRCINVERT);

			}
			else {
				putimage(enemy[i].x, enemy[i].y, ENEMY_WIDTH, ENEMY_HEIGHT, &img_enemy[1][0], 0, 0, NOTSRCERASE);
				putimage(enemy[i].x, enemy[i].y, ENEMY_WIDTH, ENEMY_HEIGHT, &img_enemy[1][1], 0, 0, SRCINVERT);
			}


		}
	}
	else {
		for (int i = 0; i < ENEMY_NUM; i++) {
			if (enemy[i].live) {
				putimage(enemy[i].x, enemy[i].y, ENEMY_WIDTH, ENEMY_HEIGHT, &img_enemy[0][0], 0, 0, NOTSRCERASE);
				putimage(enemy[i].x, enemy[i].y, ENEMY_WIDTH, ENEMY_HEIGHT, &img_enemy[0][2], 0, 0, SRCINVERT);

			}
			else {
				putimage(enemy[i].x, enemy[i].y, ENEMY_WIDTH, ENEMY_HEIGHT, &img_enemy[1][0], 0, 0, NOTSRCERASE);
				putimage(enemy[i].x, enemy[i].y, ENEMY_WIDTH, ENEMY_HEIGHT, &img_enemy[1][2], 0, 0, SRCINVERT);
			}


		}
	}
	

}

void introduceTeam()//打印团队介绍
{
	/*打印团队介绍
	* 负责人：衡皓
	* 功能：
	* 打印团队介绍
	* 在昼夜变化是调用
	* 示例参考：
	* （注意不要以为是printf）
	*  (按任意键返回)
	*/
	// 初始化绘图窗口
	//initgraph(WIDTH, HEIGHT);


	// 绘制背景颜色的线性渐变
	for (int i = 0; i < HEIGHT; i++) {
		int r = 255 * i / HEIGHT;
		int g = 255 * i /HEIGHT;
		int b = 255 * i / HEIGHT;
		setcolor(RGB(r, g, b));
		line(0, i, WIDTH, i);
	}
	//设置背景透明
	setbkmode(TRANSPARENT);
	// 绘制界面


		// 输出标题
	settextstyle(80, 0, ("楷体"));
	outtextxy(50, 50, ("团队介绍"));


	// 设置文本字体和大小
	settextstyle(30, 0, ("宋体"));

	// 输出团队成员信息
	outtextxy(50, 150, ("总负责人："));
	outtextxy(50, 200, (" 技术官 ："));
	outtextxy(50, 250, ("产品经理： "));
	outtextxy(50, 300, ("  组员  ："));

	// 输出提示信息
	outtextxy(50, 500, ("按任意键返回"));
	// 等待用户按任意键退出
	_getch();

	// 关闭绘图窗口
	






}
void introduceGameplay()//打印玩法介绍
{
	/*打印玩法介绍
	* 负责人：衡皓
	* 功能：
	* 打印玩法介绍
	* 在昼夜变化是调用
	* 示例参考：
	* （注意不要以为是printf）
	*  (按任意键返回)
	*
	*/
	// 初始化绘图窗口
	//initgraph(WIDTH, HEIGHT);
	//设置背景透明
	setbkmode(TRANSPARENT);
	

	setbkcolor(BLACK);//设置背景颜色-黑色
	cleardevice();


	//输出图片
	
	settextstyle(40, 0, "楷体");
	settextcolor(WHITE);
	outtextxy(10, 8, "游戏简介：");
	outtextxy(10, 280, "玩法介绍：");
	outtextxy(10, 580, "温馨提示：");
	settextstyle(30, 0, "楷体");

	outtextxy(0, 40, "    这是一款冒险游戏，在这个世界中只有黑夜和白天，每30S黑夜和白天会进行一次切换。");
	outtextxy(0, 65, "当黑夜降临，怪物犹如变色龙一样会从白天的黑色变成白色。怪物会苏醒并追着玩家移动，");
	outtextxy(0, 90, "如果玩家被怪物追到，那么玩家会因此殒命；当白天到来，怪物会在原地被封印成为石柱，");
	outtextxy(0, 115, "玩家如果碰到这些石柱，也会因此死亡；每当地图切换时，石柱变成怪物，怪物变成石柱");
	outtextxy(0, 140, "不过，玩家有攻击、闪现、防御三个技能，帮助玩家生存,每个技能使用后有5S的冷却时间。");

	settextcolor(WHITE);

	outtextxy(0, 325, "玩家按W（上）A（左）S（下）D（右）键移动。");
	outtextxy(0, 350, "攻击技能：按Q键 可以发射子弹攻击怪物。");
	outtextxy(0, 375, "当怪兽不小心被玩家攻击到，玩家会增加10分的积分，怪兽会变成对应");
	outtextxy(0, 400, "颜色的石柱。");
	outtextxy(0, 425, "闪现技能：按E键 玩家可以朝对应方向闪现");
	outtextxy(0, 450, "护盾技能：按R键 玩家可以获得一个持续时间为3秒的护盾，");
	outtextxy(0, 475, "在拥有护盾期间进入无敌状态，可以无视怪物的攻击和石柱的碰撞；");

	outtextxy(0, 625, "这款游戏是无尽模式，每一局游戏结束后，玩家所得积分会存档并记录到");
	outtextxy(0, 650, "积分榜，快来叫上你和你的小伙伴一起，看看谁能获得更多的积分吧！");
	outtextxy(50, 500, ("按任意键返回"));
	// 等待用户按任意键退出
	_getch();

	// 关闭绘图窗口
	
	

}
void showStandings()//*查看积分榜
{
	/*查看积分榜
	* 负责人：
	* 功能：
	* 查看积分榜
	*
	* 示例参考：
	*调用读取函数读取信息
	* 显示信息前10个
	*(按任意键返回)
	*/
}
void showSetting(int selectedOption)//显示设置
{
	/*显示设置
	* 负责人：衡皓
	* 功能：
	* 显示设置界面
	* 示例参考：

	>背景音乐 开 (关)<
	战斗音效 开 (关)
	音量大小
	返回
	*/
	// 初始化绘图窗口
	initgraph(WIDTH, HEIGHT);
	setbkmode(TRANSPARENT);
	//清空黑色屏幕后，开始绘制界面
	




}
void showSuspend(int selectedOption)//绘制暂停界面
{
	/*绘制暂停界面
	* 负责人：衡皓
	* 功能：
	* 绘制暂停界面
	* 示例参考：
	*
	 》继续游戏《
	 游戏设置
	 游戏结算
	*/
	
	// 调整文字字体和大小
	

	
	setbkmode(TRANSPARENT);
	
	// 绘制标题
	setbkcolor(BLACK);
	cleardevice();
	setcolor(WHITE);
	settextstyle(28, 0, _T("宋体"));
	outtextxy(220, 150, _T("Game pause"));

	// 绘制选项
	const char* options[] = { "继续游戏", "结束游戏" };
	int numOfOptions = sizeof(options) / sizeof(char*);
	int lineHeight = 60;
	int startX = 230;
	int startY = 240;
	for (int i = 0; i < numOfOptions; i++) {
		// 绘制选项文字
		setbkcolor(BLACK);
		setcolor(selectedOption == i ? RGB(77, 77, 77) : WHITE);
		outtextxy(startX, startY + i * lineHeight, _T(options[i]));

		// 绘制光标
		if (selectedOption == i) {
			int cursorStartX = startX - 40;  // 光标开始位置
			int cursorEndX = startX - 20;  // 光标结束位置
			int cursorY = startY + i * lineHeight + 8;  // 光标位置
			setlinecolor(WHITE);
			setlinestyle(PS_SOLID, 3);
			line(cursorStartX, cursorY, cursorEndX, cursorY);
		}
	}
	

	  


}
void showGameover()
{
	
	// 绘制游戏结束界面
	
	setfillstyle(SOLID_FILL, BLACK); // 设置填充颜色为黑色
	
	bar(0, 0, getmaxx(), getmaxy()); // 填充整个屏幕区域为黑色
	FlushBatchDraw();
	settextcolor(RGB(255, 255, 255));
	settextstyle(60, 0, "楷体");
	outtextxy(440, 10, "GAME OVER");
	outtextxy(330, 200, "本次您获得积分：100");

	
	outtextxy(10, 400, "按任意键返回主菜单");
	
	// 等待用户按任意键退出
	_getch();
	return;
	// 关闭绘图窗口
	

	
}

void showAttributes()//显示玩家部分属性
{
	/*显示玩家部分属性
	* 负责人：衡皓
	* 功能：
	* 显示玩家部分属性
	* 示例参考：
	*
	* HP:100
	Q:2s
	E:OK
	R:15s
	*/

}



/*-------------------------
*
*--运行逻辑--
*
*/
void menu()//主菜单函数
{
	/*主菜单函数
	* 负责人：陈天乐
	* 功能：
	* 实现主菜单功能
	* 示例参考：
	*
	* 参考代码：
	initgraph(Width, Height);
	

	
	*/
	//etbkcolor(BLACK);
	initgraph(WIDTH, HEIGHT);
	int selectedOption=0;
	drawMenu(selectedOption);
	while (1)
	{
		int key;
		key = _getch();
		if (key == 80) // Down arrow
		{
			selectedOption = (selectedOption + 1) % 6;
			
		}
		if (key == 72) // Up arrow
		{
			selectedOption = (selectedOption - 1) % 6;
			
		}
		if (key == 13) // Enter key
		{
			switch (selectedOption)
			{
			case 0: // 开始游戏
				// 这里放游戏逻辑代码
				gameRum();
				//showGameover();
				break;
			case 1: // 游戏设置
				// 这里放游戏设置代码
				break;
			case 2: // 玩法结束介绍
				introduceGameplay();
				// 这里放关于我们的代码
				break;
			case 3: //关于我们
				introduceTeam();
				break;
			case 4: // 积分榜
				// 这里放关于我们的代码
				break;
			case 5: // 退出游戏
				// 这里放关于我们的代码
				closegraph();
				return ;
			}
			
		}
		drawMenu(selectedOption);
	}
}
void gameRum()//游戏运行函数
{
	/*游戏运行
	* 负责人：陈天乐
	* 功能：
	* 实现游戏的整体运行
	* 示例参考：
	*
	* 示例代码：

	*/
	srand((unsigned)time(NULL));
	

	gameInit();
	BeginBatchDraw();
	createEnemy();
	while (1) {
		gameDraw();
		FlushBatchDraw();
		if (timer(5, 11)) {
			playerMove(2);
		}
		if (timer(2, 12)) {
			BulletMove(3);
		}
		
		adjustCoordinates();//坐标修正函数 
		enemyTakeDamage();
		playerTakeDamage();
		dayAltionMethod();
		if (timer(10, 13)) {
			enemyMove(1);
		}
		
		if (ifGameover()) {//判断游戏是否结束
			
			
			return;
		}
	}
	

}
void playerMove(int speed)//判断控制玩家操作
{
	/*/判断控制玩家操作
	* 负责人：陈天乐
	* 功能：
	* 获取玩家的输入，根据输入调用函数和写入相应代码
	* 上下左右移动（更改玩家朝向） 技能类函数 暂停函数
	* 根据玩家边缘判断函数限制玩家移动
	* 判断边缘的墙体返回上（1）下（1）左（1）右（1）
	*  playerOnEdge()//玩家边缘判断函数
	* 示例参考：
	* 	 1101表示左边不能通行
	*    1100表示左右不能通行
	*代码示例：
	*/
#if 0
#elif 1
	// 如果要检测字面按键必须要大写
	if ((GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')) )
	{
		player.y -= speed;
		player.orientation = 0;

	}
	if ((GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')) )
	{
		player.y += speed;
		player.orientation = 1;
		
	}
	if ((GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')))
	{
		player.x -= speed;
		player.orientation = 2;
	}
	if ((GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')))
	{
		
		player.x += speed;
		player.orientation = 3;
		

	}
	if (GetAsyncKeyState('Q') && timer(100, 2))
	{
		playerAttack();//玩家攻击Q

	}
	if (GetAsyncKeyState('E') && timer(100, 3))
	{
		playerFlash();//玩家闪现E

	}
	if (GetAsyncKeyState('R') && timer(100, 4))
	{
		playerShield();//玩家护盾R

	}
	if (GetAsyncKeyState(VK_SPACE))
	{
		suspend();//暂停控制函数

	}



#endif

}
void suspend()//暂停控制函数
{
	
	int selectedOption = 0;//当前选项
	showSuspend(selectedOption);

	while (true) {
		if (_kbhit()) {
			char key = _getch();


			if (key == 13) {
				//回车键确认选项switch (selectedOption)
				switch (selectedOption) {
				case 0: // 继续游戏
					// 这里游戏继续运行的代码
					

					return;
				case 1: // 游戏结束
					//这里放游戏结束界面的函数
					showGameover();


					
					return;
				}
				
			}

			if (key == 80) {
				//向下键
				selectedOption = (selectedOption + 1) % 2;
			}
			if (key == 72) {
				//向上键
				selectedOption = (selectedOption - 1) % 2;
			}
			showSuspend(selectedOption);
		}
	}
	
}
bool timer(int ms, int id) //定时器
{
	//可以实现技能冷却怪物刷新等
	static DWORD t[20];//id列表 

	if (clock() - t[id] > ms)
	{
		t[id] = clock();
		return true;
	}

	return false;
}
void playerAttack()//玩家攻击Q
{
	/*玩家攻击Q
	* 负责人：李奕衡
	* 功能：
	* 实现攻击功能生成子弹
	
	* 调用生成子弹函数
	* 示例参考：

	*/

	createBullet();



}
void playerFlash()//玩家闪现E
{
	/*玩家闪现E
	* 负责人：李奕衡
	* 功能：
	* 实现玩家闪现
	* 获取玩家朝向
	* 对相应方向坐标调整一定距离
	
	* 示例参考：

	*/
	const int distance = 100; // 闪现距离

	// 坐标默认的原点在窗口的左上角，X 轴向右为正，Y 轴向下为正。
	switch (player.orientation)
	{
	case 0:
		player.y -= distance;
		break;
	case 1:
		player.y += distance;
		break;
	case 2:
		player.x -= distance;
		break;
	case 3:
		player.x += distance;
		break;
	}
}
void playerShield()//玩家护盾R
{
	/*玩家护盾R
	* 负责人：李奕衡
	* 功能：
	* 实现玩家护盾功能
	* 调用定时器调整玩家为无敌状态
	* bool timer(int ms, int id)
	* 时间到调会原来状态
	
	* 示例参考：

	*/

	int shieldId = 3;// 护盾技能持续Id
	
	// 触发技能将玩家状态置为无敌
	player.status = 1;

	// 护盾持续时间结束，将无敌状态码置为0
	if (timer(3000,shieldId))player.status = 0;
}

void enemyMove(int speed)//敌人移动
{
	/*敌人移动
	* 负责人：夏竞秋
	* 功能：
	* 敌人根据玩家坐标移动
	* 调用enemyOnEdge()//敌人边缘判断函数
	* 限制敌人的无效移动
	* （注意当前实现游戏无边界）
	*
	*/
	for (int i = 0; i < ENEMY_NUM; i++) {
		if (enemy[i].live) {
			// 计算敌人到玩家的向量
			int dx = player.x - enemy[i].x;
			int dy = player.y - enemy[i].y;
			
			
			if (dx > 0) {
				int dx2 = WIDTH - dx;
				if (dx > dx2) {
					dx = dx2*-1;
				}
			}
			else {
				int dx2 = (WIDTH + dx) * -1;
				if (dx < dx2) {
					dx = dx2*-1;
				}
			}
			if (dy > 0) {
				int dy2 = HEIGHT - dy;
				if (dy > dy2) {
					dy = dy2*-1;
				}
			}
			else {
				int dy2 = (WIDTH + dy) * -1;
				if (dy < dy2) {
					dy = dy2*-1;
				}
			}
			// 根据向量方向移动敌人
			if (dy > 0) {
				enemy[i].y += speed;
			}
			else {
				enemy[i].y -= speed;
			}
			if (dx > 0) {
				enemy[i].x += speed;
			}
			else {
				enemy[i].x -= speed;
			}
		}
	}
	
}

void createBullet()//子弹生成
{
	/*子弹生成函数
	* 负责人:陈天乐
	* 功能：
	*实现子弹的生成
	* 获取玩家朝向orientation
	* 赋值给子弹方向
	* 示例参考：
	*/
	for (int i = 0; i < BULLLET_NUM; i++) {
		if (!bull[i].live) {

			bull[i].x = player.x + player.width / 2;
			bull[i].y = player.y + player.height / 2;
			bull[i].orientation = player.orientation;
			bull[i].live = true;
			
			break;
		}
	}
	
}
void BulletMove(int speed)//子弹移动
{
	/*子弹移动
	* 负责人：陈天乐
	* 功能：
	*实现子弹移动
	* 获根据子弹方向移动子弹

	* 示例参考：
	* */
	for (int i = 0; i < BULLLET_NUM; i++) {
		if (bull[i].live) {
			switch (bull[i].orientation)
			{
			case 0:
				bull[i].y -= speed;
				if (bull[i].y < 0)
				{
					bull[i].live = false;
				}
				break;
			case 1:
				bull[i].y += speed;
				if (bull[i].y > HEIGHT)
				{
					bull[i].live = false;
				}
				break;
			case 2:
				bull[i].x -= speed;
				if (bull[i].x < 0)
				{
					bull[i].live = false;
				}
				break;
			case 3:
				bull[i].x += speed;
				if (bull[i].x> WIDTH)
				{
					bull[i].live = false;
				}
				break;
			}
			
			
		}
	}
	
}
void createEnemy()//敌人生成
{
	/*敌人生成函数
	* 负责人：夏竞秋
	* 功能：
	*实现敌人生成
	开局随机位置生成敌人与玩家保持一定距离
	*/
	for (int i = 0; i < ENEMY_NUM/2; i++) {
		if (!enemy[i].live)
		{
			enemy[i].live = true;
		}
		

	}
	
	
}

void adjustCoordinates()//坐标修正函数 
{
	/*坐标修正函数
	* 负责人：梁春琳
	* 功能：
	*获取玩家坐标敌 人坐标
	当角色坐标与石柱重合或者超边界范围，则修改坐标
	与角色重合修改至最近没有石柱的坐标
	超边界范围修改至另一边的坐标
	*/
	//判断玩家否超出地图边界 超过则到达另一边

	if (player.x < 0) {
		player.x = My::WIDTH - player.width;
	}
	if (player.x > My::WIDTH - player.width) {
		player.x = 0;
	}
	if (player.y < 0) {
		player.y = My::HEIGHT - player.height;
	}
	if (player.y > My::HEIGHT - player.height) {
		player.y = 0;
	}

	for (int i = 0; i < ENEMY_NUM; i++) {
		
		if (enemy[i].x < 0) {
			enemy[i].x = My::WIDTH - enemy[i].width;
		}
		if (enemy[i].x > My::WIDTH - enemy[i].width) {
			enemy[i].x = 0;
		}
		if (enemy[i].y < 0) {
			enemy[i].y = My::HEIGHT - enemy[i].height;
		}
		if (enemy[i].y > My::HEIGHT - enemy[i].height) {
			enemy[i].y = 0;
		}

		
	}

	
}

void playerTakeDamage()//玩家受到攻击
{
	/*玩家受到攻击
	* 负责人：夏竞秋
	* 功能：
	*获取玩家HP属性
	判断玩家坐标是否在敌人的攻击范围
	是则扣除血量
	当血量小于等于0判断死亡
	修改玩家live参数
	*/
	for (int i = 0; i < ENEMY_NUM; i++) {
		if (enemy[i].live) {//判断是否在范围内
			if (enemy[i].x + enemy[i].width + enemy[i].ACK_R >= player.x + player.width &&
				enemy[i].x - enemy[i].ACK_R <= player.x &&
				enemy[i].y + enemy[i].height + enemy[i].ACK_R >= player.y + player.height &&
				enemy[i].y - enemy[i].ACK_R <= player.y) {
				--player.hp;
				break;
			}
		}
	}//判断所有敌人能否攻击到
	if (player.hp <= 0) {
		player.live = false;
	}//修改状态

}
void enemyTakeDamage()//敌人受到攻击
{
	/*敌人受到攻击
	* 负责人：夏竞秋
	* 功能：
	*获取当前页面敌人HP属性
	判断敌人坐标是否在子弹的命中范围
	是则扣除血量
	当血量小于等于0判断死亡
	修改敌人live参数
	*/

	for (int i = 0; i < BULLLET_NUM; i++)//每颗子弹
	{
		if (bull[i].live) {
			for (int j = 0; j < ENEMY_NUM; j++)//对每个敌人
			{
				if (bull[i].x > enemy[j].x && bull[i].x < enemy[j].x + enemy[j].width
					&& bull[i].y > enemy[j].y && bull[i].y < enemy[j].y + enemy[j].height) {
					bull[i].live = false;
					if (enemy[j].live) {
						--enemy[j].hp;
					}
					
				}//子弹是否在敌人图像内
				if (enemy[j].hp <= 0) {
					ememyHP(j);
				}
			}
		}
	}

}
void dayAltionMethod()//昼夜变换函数
{
	/*昼夜变换函数
	* 负责人：梁春琳
	* 功能：
	*调用定时器进行切换冷却
	* bool timer(int ms, int id)

	修改敌人live参数
	定时修改全局参数bool day;//Ture白天false黑夜
	* 示例参考：

	*/
	if (timer(30000, 0)) {
		day = !day;
		for (int i = 0; i < My::ENEMY_NUM; ++i) {
			enemy[i].live = !enemy[i].live;
		}
	}
	
}
bool ifGameover()//判断游戏是否结束
{
	/*判断游戏是否结束
	* 负责人：孙思远
	* 功能：
	* 根据玩家的live值
	*判断游戏是否结束
	* 是则返回游戏结束界面
	* 示例参考：

	*/
	if (player.live) {
		
		return false;
	}
	
	else {
		
		return true;
	}

}




